package com.zmn.mcc.manager.utils;

import com.zmn.common.utils.number.NumberUtil;
import com.zmn.mcc.common.constant.SystemConsts;
import com.zmn.mcc.model.dto.dpermit.DpermitBaseDO;
import com.zmn.mcc.model.dto.dpermit.DpermitSimpleDO;
import groovy.lang.Tuple2;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author heguanghua
 * @since 2020/05/20 10:43
 */
public class DpermitUtil {


    // region 检查并处理简单数据对象选中状态

    /**
     * 检查并处理简单数据对象选中状态
     * 下级部分选中则上级选中，下级全部选中则对上级进行标识
     * @param simples 当前对象的子集
     * @param chedked 当前对象是否勾选
     * @return Tuple2<选中数量, 是否全选> 只要有一个下级未全选，则所有上级都非全选
     */
    public static Tuple2<Integer, Boolean> checkSelected(List<DpermitSimpleDO> simples, boolean chedked) {

        // 最后一级
        if(simples.size() == 0) {
            return new Tuple2<Integer, Boolean>(0, chedked ? true : false);
        }

        Set<Integer> set1 = new HashSet<>();    // 选中数量，用set防止重复添加
        Set<Integer> set2 = new HashSet<>();    // 全选数量
        for(DpermitSimpleDO simple: simples) {

            if(simple.isChecked()) {
                set1.add(simple.getDataId());
            }

            // 迭代子集
            Tuple2<Integer, Boolean> tuple2 = checkSelected(simple.getSubors(), simple.isChecked());

            /**
             * 计算子集是否全选
             */
            if(simple.getLowerSubCount() > 0) {         // 如果是最后层级对象，其有子集，则对象的子集肯定为不全选
                simple.setSubAll(false);
            } else if(tuple2.getV2().booleanValue()) {  // 下级全选，则上级全选
                simple.setSubAll(true);
                set2.add(simple.getDataId());
            }

            /**
             * 计算自身是否选中
             * 子集全选或勾选数量>0
             */
            if(simple.isSubAll() || tuple2.getV1() > 0 || simple.getLowerSubCount() > 0) {
                simple.setChecked(true);
                set1.add(simple.getDataId());
            }


            // 子集勾选数量>0，或最后层级对象有子集(如果是)
//            if(simple.getLowerSubCount() > 0 || tuple2.getV1() > 0) {
//                simple.setChecked(true);
//                set1.add(simple.getDataId());
//            }
//            if(simple.isChecked()) {
//                if(tuple2.getV2().booleanValue()) {
//                    set2.add(simple.getDataId());
//                }
//            }
//
//            // 下级全选，则上级全选
//            if(tuple2.getV2().booleanValue()) {
//                simple.setSubAll(true);
//            }
//
//            // 如果是最后层级对象，其有子集，则对象的子集肯定为不全选
//            if(simple.getLowerSubCount() > 0) {
//                simple.setSubAll(false);
//            }

//            System.out.println(String.format("%s-2 -----id:[%s],name:[%s],check:[%s-%s],tuple2:[%s-%s]",
//                    simple.getDataName(), simple.getDataId(), simple.getDataName(), simple.isChecked(), simple.isSubAll(), tuple2.getV1(), tuple2.getV2()));
            //System.out.println(String.format("%s-3 =======", simple.getDataName()));
        }

        // 子集是否全选：1)当前对象勾选且子集勾选数为0，2)子集勾选数=子集全选数=子集数
        boolean allChecked = false;
        if(chedked && set1.size() == 0) {
            allChecked = true;
        } else if(set1.size() == set2.size() && set2.size() == simples.size()) {
            allChecked = true;
        }

        // 返回给上级调用
        return new Tuple2<Integer, Boolean>(set1.size(), allChecked);
    }
    // endregion

    // region 转换为简单数据权限对象

    /**
     * 转换为简单数据权限对象
     * @param dpermit
     * @return
     */
    public static DpermitSimpleDO parseToDpermitSimpleDO(DpermitBaseDO dpermit) {
        if(dpermit == null) {
            return null;
        }
        DpermitSimpleDO simple = new DpermitSimpleDO();
        simple.setDataId(dpermit.getDataId());
        simple.setDataName(dpermit.getDataName());
        simple.setParentId(dpermit.getDataParentId());
        simple.setLevel(dpermit.getDataLevel());
        return simple;
    }
    // endregion


    @Deprecated
    public static boolean isNullOrZeroooo(Number number) {
        return number == null || "0".equals(number + "");
    }
    public static boolean isNotNullOrZeroooo(Number number) {
        return !isNullOrZeroooo(number);
    }

    public static void main(String[] args) {
        Integer   value = 1;
        Integer value2 = 1;
        Long    value3 = 1L;
        Double  value4 = 1D;
        //boolean isNull = isNullOrZeroooo(value);
        System.out.println("======" + NumberUtil.isNullOrZero(value));
        System.out.println("======" + NumberUtil.isNullOrZero(value2));
        System.out.println("======" + NumberUtil.isNullOrZero(value3));
        System.out.println("======" + NumberUtil.isNullOrZero(value4));
    }
}
